//Fonctions Utilitaires
window.utils = {

    /* Permet de Binder la view avec son template */
    binderView : function(view, callback)
    {
        $.get('views/'+view+'.ejs', function(data) {
            window[view].prototype.template = _.template(data);
            callback();
        });
    },

    /**
     * Charge Plusieurs scripts
     * @param {Array} scripts Tableau de Script: ["script1.js", "script2js"]
     * @param {Function} callback Fonction appelé quand les script seront chargés
     */
     
    loadScripts : function(scripts, callback){
      //Principe : On charge un Script, on appele le callback qui charge le suivant  
      function createCallback(method, args){
        return function() {
          return method.apply(window, args);
        };
      }
      var callbacks = new Array(createCallback(this.loadScript, [scripts[scripts.length - 1], callback]));
      for (var i = scripts.length - 2; i > 0; i--) {
        callbacks.unshift(createCallback(this.loadScript, [scripts[i], callbacks[0], true]));
      }
      this.loadScript(scripts[0], callbacks[0]);
    },

    
     //Charge un script dynamiquemenet
     loadScript : function(url, callback, forceCallback) {
      //On crée unt tableau pour référencer les scripts que l'on a loadé
      if (!this.loadedScript) {
        this.loadedScript = new Array();
      }
      //Si le script n'existe pas déja
      if ($.inArray(url, this.loadedScript) == -1) {
        this.loadedScript.push(url);
        var e = document.createElement("script");
        e.src = url + "?" + Math.random();
        e.type = "text/javascript";
        if (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent)) {
          // IE
          e.onreadystatechange = function(){
            if (this.readyState == 'loaded') {
              callback();
            }
          }
        } else {
          // Other browsers
          e.onload = callback;
        }
        document.getElementsByTagName("body")[0].appendChild(e);
      } else {
        if (forceCallback) {
          callback();
        }
      }
    },

    //Fonction permettant de réaliser le reset d'un formulaire
    resetform : function(form)
    {
      form.each(function(){
          console.log(this);
          this.reset();
      });
    },

    //Function permettant d'afficher les message d'erreur (3 types, tooltip, inline ou default=block)
    displayValidationErrors: function(view, attr, error, selector) {
          var control, group, position, target;
          control = view.$('[' + selector + '=' + attr + ']');
          group = control.parents(".control-group");
          group.addClass("error");
          if (control.data("error-style") === "tooltip") {
            position = control.data("tooltip-position") || "right";
            //On supprime le tooltip si il existe
            control.tooltip('destroy');
            //On créé un tooltip
            control.tooltip({
              placement: position,
              trigger: "manual",
              title: error
            });
            return control.tooltip("show");
          } else if (control.data("error-style") === "inline") {
            if (group.find(".help-inline").length === 0) {
              group.find(".controls").append("<span class=\"help-inline error-message\"></span>");
            }
            target = group.find(".help-inline");
            return target.text(error);
          } else {
            if (group.find(".help-block").length === 0) {
              group.find(".controls").append("<p class=\"help-block error-message\"></p>");
            }
            target = group.find(".help-block");
            return target.text(error);
          }
    },

    removeValidationError: function(view, attr, selector) {
        var control, group;
        control = view.$('[' + selector + '=' + attr + ']');
        group = control.parents(".control-group");
        group.removeClass("error");
        if (control.data("error-style") === "tooltip") {
          if (control.data("tooltip")) {
            return control.tooltip("hide");
          }
        } else if (control.data("error-style") === "inline") {
          return group.find(".help-inline.error-message").remove();
        } else {
          return group.find(".help-block.error-message").remove();
        }
    },

    nomproprePattern: function()
    {
        return /^([a-zA-Z0-9'àâéèêôùûçÀÂÉÈÔÙÛÇ -]{1,30})$/;
    }

};